home *** CD-ROM | disk | FTP | other *** search
/ Chip 2007 January, February, March & April / Chip-Cover-CD-2007-02.iso / Pakiet multimedia / Muzyka / Edytory sampli (probek dzwieku) / ZynAddSubFX_2.2.0 / Setup_ZynAddSubFX-2.2.0.exe / source code / Misc / Part.h < prev    next >
C/C++ Source or Header  |  2005-03-14  |  6KB  |  175 lines

  1. /*
  2.   ZynAddSubFX - a software synthesizer
  3.  
  4.   Part.h - Part implementation
  5.   Copyright (C) 2002-2005 Nasca Octavian Paul
  6.   Author: Nasca Octavian Paul
  7.  
  8.   This program is free software; you can redistribute it and/or modify
  9.   it under the terms of version 2 of the GNU General Public License 
  10.   as published by the Free Software Foundation.
  11.  
  12.   This program is distributed in the hope that it will be useful,
  13.   but WITHOUT ANY WARRANTY; without even the implied warranty of
  14.   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  15.   GNU General Public License (version 2) for more details.
  16.  
  17.   You should have received a copy of the GNU General Public License (version 2)
  18.   along with this program; if not, write to the Free Software Foundation,
  19.   Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
  20.  
  21. */
  22.  
  23. #ifndef PART_H
  24. #define PART_H
  25.  
  26. #define MAX_INFO_TEXT_SIZE 1000
  27.  
  28. #include "../globals.h"
  29. #include "../Params/ADnoteParameters.h"
  30. #include "../Params/SUBnoteParameters.h"
  31. #include "../Params/PADnoteParameters.h"
  32. #include "../Synth/ADnote.h"
  33. #include "../Synth/SUBnote.h"
  34. #include "../Synth/PADnote.h"
  35. #include "../Params/Controller.h"
  36. #include "../Misc/Microtonal.h"
  37. #include "../DSP/FFTwrapper.h"
  38. #include "../Effects/EffectMgr.h"
  39. #include "XMLwrapper.h"
  40.  
  41. class Part{
  42.  
  43.     public:
  44.       Part(Microtonal *microtonal_,FFTwrapper *fft_,pthread_mutex_t *mutex_);
  45.       ~Part();
  46.  
  47.       /* Midi commands implemented */      
  48.       void NoteOn(unsigned char note,unsigned char velocity,int masterkeyshift); 
  49.       void NoteOff(unsigned char note); 
  50.       void AllNotesOff();//panic
  51.       void SetController(unsigned int type,int par);
  52.       void RelaseSustainedKeys();//this is called when the sustain pedal is relased 
  53.       void RelaseAllKeys();//this is called on AllNotesOff controller
  54.  
  55.       /* The synthesizer part output */      
  56.       void ComputePartSmps();//Part output
  57.     
  58.       //instrumentonly: 0 - save all, 1 - save only instrumnet, 2 - save only instrument without the name(used in bank)
  59.  
  60.  
  61.       //saves the instrument settings to a XML file
  62.       //returns 0 for ok or <0 if there is an error
  63.       int saveXML(char *filename);
  64.       int loadXMLinstrument(const char *filename);
  65.  
  66.       void add2XML(XMLwrapper *xml);
  67.       void add2XMLinstrument(XMLwrapper *xml);
  68.       
  69.       void defaults();
  70.       void defaultsinstrument();
  71.       
  72.       void applyparameters();
  73.       
  74.       void getfromXML(XMLwrapper *xml);
  75.       void getfromXMLinstrument(XMLwrapper *xml);
  76.  
  77.       void cleanup();
  78.  
  79. //      ADnoteParameters *ADPartParameters;
  80. //      SUBnoteParameters *SUBPartParameters;
  81.  
  82.       //the part's kit
  83.       struct {
  84.         unsigned char Penabled,Pmuted,Pminkey,Pmaxkey;
  85.     unsigned char *Pname;
  86.     unsigned char Padenabled,Psubenabled,Ppadenabled;
  87.     unsigned char Psendtoparteffect;
  88.         ADnoteParameters *adpars;
  89.         SUBnoteParameters *subpars;
  90.         PADnoteParameters *padpars;
  91.       } kit[NUM_KIT_ITEMS];
  92.  
  93.       
  94.       //Part parameters
  95.       void setkeylimit(unsigned char Pkeylimit);
  96.       void setkititemstatus(int kititem,int Penabled_);
  97.  
  98.       unsigned char Penabled;//if the part is enabled
  99.       unsigned char Pvolume;//part volume
  100.       unsigned char Pminkey;//the minimum key that the part receives noteon messages
  101.       unsigned char Pmaxkey;//the maximum key that the part receives noteon messages
  102.       void setPvolume(char Pvolume);
  103.       unsigned char Pkeyshift;//Part keyshift
  104.       unsigned char Prcvchn;//from what midi channel it receive commnads
  105.       unsigned char Ppanning;//part panning
  106.       void setPpanning(char Ppanning);
  107.       unsigned char Pvelsns;//velocity sensing (amplitude velocity scale)
  108.       unsigned char Pveloffs;//velocity offset
  109.       unsigned char Pnoteon;//if the part receives NoteOn messages
  110.       unsigned char Pkitmode;//if the kitmode is enabled
  111.       unsigned char Pdrummode;//if all keys are mapped and the system is 12tET (used for drums)
  112.  
  113.       unsigned char Ppolymode;//Part mode - 0=monophonic , 1=polyphonic
  114.       unsigned char Pkeylimit;//how many keys are alowed to be played same time (0=off), the older will be relased
  115.       
  116.       unsigned char *Pname; //name of the instrument
  117.       struct{//instrument additional information
  118.             unsigned char Ptype;
  119.         unsigned char Pauthor[MAX_INFO_TEXT_SIZE+1];
  120.         unsigned char Pcomments[MAX_INFO_TEXT_SIZE+1];
  121.       } info;
  122.       
  123.       
  124.       REALTYPE *partoutl;//Left channel output of the part
  125.       REALTYPE *partoutr;//Right channel output of the part
  126.  
  127.       REALTYPE *partfxinputl[NUM_PART_EFX+1],*partfxinputr[NUM_PART_EFX+1];//Left and right signal that pass thru part effects; partfxinput l/r [NUM_PART_EFX] is for "no effect" buffer
  128.  
  129.       enum NoteStatus{KEY_OFF,KEY_PLAYING,KEY_RELASED_AND_SUSTAINED,KEY_RELASED};
  130.  
  131.       REALTYPE volume,oldvolumel,oldvolumer;//this is applied by Master
  132.       REALTYPE panning;//this is applied by Master, too
  133.       
  134.       Controller ctl;//Part controllers
  135.  
  136.       EffectMgr *partefx[NUM_PART_EFX];//insertion part effects (they are part of the instrument) 
  137.       unsigned char Pefxroute[NUM_PART_EFX];//how the effect's output is routed(to next effect/to out)
  138.       bool Pefxbypass[NUM_PART_EFX];//if the effects are bypassed
  139.       
  140.  
  141.       pthread_mutex_t *mutex;
  142.       
  143.       int lastnote;      
  144.       
  145.     private:
  146.       void KillNotePos(int pos); 
  147.       void RelaseNotePos(int pos);      
  148.       int killallnotes;//is set to 1 if I want to kill all notes
  149.       
  150.       struct PartNotes{
  151.         NoteStatus status;
  152.         int note;//if there is no note playing, the "note"=-1
  153.     int itemsplaying;
  154.     struct {    
  155.             ADnote *adnote;
  156.             SUBnote *subnote;
  157.             PADnote *padnote;
  158.         int sendtoparteffect;
  159.     } kititem[NUM_KIT_ITEMS];
  160.     int time;
  161.       };
  162.     
  163.       PartNotes partnote[POLIPHONY];
  164.       
  165.       REALTYPE *tmpoutl;//used to get the note
  166.       REALTYPE *tmpoutr;
  167.     
  168.       REALTYPE oldfreq;//this is used for portamento
  169.       Microtonal *microtonal;
  170.       FFTwrapper *fft;
  171. };
  172.  
  173. #endif
  174.  
  175.